from langchain_core.prompts import PromptTemplate, ChatPromptTemplate, MessagesPlaceholder
from typing import Optional

REPHRASE_QUESTION_PROMPT_TEMPLATE = """
以下是一段对话和一个后续问题，请将该后续问题改写为一个独立的问题，保持其原有语言不变。

对话历史:
{chat_history}

后续问题: {input}
独立问题:"""
rephrase_question_prompt = ChatPromptTemplate.from_messages([
    ("system", REPHRASE_QUESTION_PROMPT_TEMPLATE),
    MessagesPlaceholder(variable_name="chat_history"),
    ("human", "{input}"),
])

RAG_ANSWER_PROMPT_TEMPLATE = """
你是一个擅长问答任务的专家助手。
请利用以下检索到的上下文来回答问题。
如果你不知道答案，就直接说你不知道。
请保持回答简洁。

问题: {input} 
上下文: {context} 
回答:"""
rag_answer_prompt = ChatPromptTemplate.from_messages([
    ("system", RAG_ANSWER_PROMPT_TEMPLATE),
    MessagesPlaceholder(variable_name="chat_history"),
    ("human", "{input}"),
])

AGENT_SYSTEM_PROMPT = (
    "你是一个能够使用一系列工具的有用助手。"
    "请使用提供的工具来回答用户的问题。"
    "如果无法使用工具回答，请如实说明。"
)
agent_prompt = ChatPromptTemplate.from_messages([
    ("system", AGENT_SYSTEM_PROMPT),
    MessagesPlaceholder(variable_name="chat_history", optional=True),
    ("human", "{input}"),
    MessagesPlaceholder(variable_name="agent_scratchpad"),
])

SIMPLE_CHAT_PROMPT = ChatPromptTemplate.from_messages([
    ("system", "你是一个乐于助人且友好的对话型 AI。"),
    MessagesPlaceholder(variable_name="chat_history"),
    ("human", "{input}"),
])
STYLE_PROMPT_MAPPING = {
    "concise": """
    【风格约束】
    1. 回答必须控制在3句话内，总字数≤50
    2. 必须包含至少1个泰拉瑞亚专有名词（如：神圣锭、叶绿矿、灾厄模式）
    3. 禁用任何解释性语句，直接给出结论
    
    示例问题：如何合成永夜之刃？
    示例回答：永夜之刃=血腥屠刀+魔光剑+村正+炽焰巨剑，在铁砧合成。
    """,
    "detailed":"""
    【风格约束】
    1. 回答必须包含3个部分：准备工作、合成步骤、注意事项
    2. 每个部分使用标题：【准备】【步骤】【注意】
    3. 必须包含具体数值（如NPC售价、掉落概率、物品属性）
    
    示例问题：如何召唤血肉墙？
    示例回答：
    【准备】向导巫毒娃娃（击杀恶魔/巫毒恶魔掉落，掉率1%）、熔岩池（地狱层）
    【步骤】在熔岩池中使用向导巫毒娃娃，等待血肉墙生成（约30秒）
    【注意】召唤成功后进入困难模式，世界将永久改变
    """,
    "humorous":   """
    【风格约束】
    1. 必须包含至少2个泰拉瑞亚梗（如"向导又被砸了"、"克苏鲁的眼睛在盯着你"）
    2. 至少使用1个夸张比喻（如"比在猩红之地找草药还难"）
    3. 结尾必须有一句调侃或建议（如"记得带够治疗药水，否则向导会先你一步去世"）
    
    示例问题：如何获得悠悠球袋？
    示例回答：
    想要悠悠球袋？先去打世纪之花吧！这比让向导盖个像样的房子还难十倍！
    击败后找蒸汽朋克人购买，售价10金币——比史莱姆掉钱还难赚！
    记得别在背包塞满凝胶的时候买，否则向导会嘲笑你"收集癖晚期"！
    """,
    "professional": """
    【风格约束】
    1. 必须使用至少3个游戏机制术语（如：NPC AI、碰撞箱、伤害类型）
    2. 分析合成逻辑或物品设计目的（如"该合成路径旨在平衡前期资源获取"）
    3. 对比同类物品优缺点（如"相比天顶剑，泰拉之刃攻击速度快15%，但伤害低10%"）
    
    示例问题：为什么圣骑士在地牢不刷新？
    示例回答：
    圣骑士的刷新机制与NPC AI状态绑定，需满足以下条件：
    1. 玩家已击败石巨人
    2. 地牢中没有其他敌对NPC
    3. 当前时间为白天（7:30 AM - 7:30 PM）
    设计逻辑上，这种刷新条件旨在避免玩家通过刷圣骑士无限获取神圣锭。
    与其他困难模式BOSS相比，圣骑士的刷新频率更低（约每5分钟一次尝试）。
    """,
    "default": "请根据问题的性质，提供合适的回答。"
}


def get_rag_answer_prompt(style: Optional[str] = None):
    base_prompt = rag_answer_prompt
    if not style:
        return base_prompt

    # 风格指令放在最前面，用【】突出强调
    style_instructions = f"""【注意】你必须严格遵守以下风格要求，再回答问题：
    {STYLE_PROMPT_MAPPING[style]}
    """

    # 合并风格指令和基础提示
    messages = base_prompt.messages.copy()
    if messages and messages[0].prompt.template:
        # 风格指令 + 基础提示（确保风格优先）
        messages[0].prompt.template = f"{style_instructions}{messages[0].prompt.template}"

    return ChatPromptTemplate(messages=messages)